使用Java中的HttpURLConnection发送带有GET请求的请求正文

时间:2019-07-21 21:26:14

标签: java android api web-services 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()时,即使您已将请求类型明确设置为 GET ,请求类型也会自动设置为 POST 。使用 connection.setRequestMethod(“ GET”)

问题是我正在使用接受请求参数作为GET请求主体的第三方Web服务(API)

<get-request>
/myAPIEndPoint
body = parameter1=value as application/x-www-form-urlencoded

<response>
{json}

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

1 个答案:

答案 0 :(得分:0)

使用此代码,您将需要做一些修改,但它将完成工作。

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.1
User-Agent: Java Socket
Content-Type: application/x-www-form-urlencoded

parameter1=value&parameter2=value2

注意:如果要进行https连接,这是针对HTTP请求的,请参考链接SSLSocketClient