猿问

在 java 中使用 HttpURLConnection 发送带有 GET 请求的请求体

请不要将我的问题与使用 HttpURLConnection 发送带有 POST 请求的正文混淆。


我想使用 HttpURLConnection 发送带有 GET 请求的正文。这是我正在使用的代码。


public static String makeGETRequest(String endpoint, String encodedBody) {

    String responseJSON = null;

    URL url;

    HttpURLConnection connection;


    try {

        url = new URL(endpoint);

        connection = (HttpURLConnection) url.openConnection();


        connection.setInstanceFollowRedirects(true);

        connection.setDoOutput(true);

        connection.setRequestMethod("GET");

        connection.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");


        connection.connect();

        OutputStream outputStream = connection.getOutputStream();

        outputStream.write(encodedBody.getBytes());

        outputStream.flush();


        Util.log(connection,connection.getResponseCode()+":"+connection.getRequestMethod());


        BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(connection.getInputStream()));

        String responseChunk = null;

        responseJSON = "";

        while ((responseChunk = bufferedReader.readLine()) != null) {

            responseJSON += responseChunk;

        }


        bufferedReader.close();

        connection.disconnect();


    } catch (Exception e) {

        e.printStackTrace();

        Util.log(e, e.getMessage());

    }


    return responseJSON;

}

实际情况是根据 connection.getInputStream()和connection.getOutPutStream() 自动识别请求类型。


当您调用connection.getOutPutStream()时,请求类型会自动设置为POST,即使您已使用connection.setRequestMethod("GET")将请求类型明确设置为GET。


问题是我正在使用第 3 方 Web 服务 (API),它接受请求参数作为 GET 请求的正文


<get-request>

/myAPIEndPoint

body = parameter1=value as application/x-www-form-urlencoded


<response>

{json}

我很清楚大多数情况下 GET 没有请求主体,但许多 Web 服务经常使用带有参数的 GET 请求作为主体而不是查询字符串。请指导我如何在不使用任何第 3 方库(OkHttp、Retrofit、Glide 等)的情况下在 android 中发送带正文的 GET 请求


MMTTMM
浏览 340回答 1
1回答

精慕HU

使用这段代码你需要做一些修改,但它会完成工作。package com.kundan.test;import java.io.BufferedReader;import java.io.InputStreamReader;import java.io.OutputStream;import java.net.Socket;public class GetWithBody {    public static final String TYPE = "GET ";    public static final String HTTP_VERSION = " HTTP/1.1";    public static final String LINE_END = "\r\n";    public static void main(String[] args) throws Exception {        Socket socket = new Socket("localhost", 8080); // hostname and port default is 80        OutputStream outputStream = socket.getOutputStream();        outputStream.write((TYPE + "<Resource Address>" + HTTP_VERSION + LINE_END).getBytes());//         outputStream.write(("User-Agent: Java Socket" + LINE_END).getBytes());        outputStream.write(("Content-Type: application/x-www-form-urlencoded" + LINE_END).getBytes());        outputStream.write(LINE_END.getBytes()); //end of headers        outputStream.write(("parameter1=value&parameter2=value2" + LINE_END).getBytes()); //body         outputStream.flush();        BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(socket.getInputStream()));        StringBuilder builder = new StringBuilder();        String read = null;        while ((read = bufferedReader.readLine()) != null) {            builder.append(read);        }        String result = builder.toString();        System.out.println(result);    }}这是原始 HTTP 请求转储GET <Resource Address> HTTP/1.1User-Agent: Java SocketContent-Type: application/x-www-form-urlencodedparameter1=value&parameter2=value2
随时随地看视频慕课网APP

相关分类

Java
我要回答